home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
program
/
fpkpas92.zip
/
SRCRTL.ZIP
/
RTL
/
DOS
/
GO32V2
/
SET.INC
< prev
Wrap
Text File
|
1997-07-01
|
4KB
|
137 lines
{****************************************************************************
Copyright (c) 1994,95 by Florian Klämpfl
****************************************************************************}
{ Includedatei mit Unterprogrammen zur Mengenbearbeitung }
{ diese sollten nie direkt aufgerufen werden, }
{ die Aufrufe werden vom Compiler direkt erzeugt }
{ fügt das Element b der Menge zu, auf die p zeigt }
procedure do_set(p : pointer;b : byte);[public,alias: 'SET_SET_BYTE'];
begin
asm
pushl %eax
movl 8(%ebp),%edi
movb 12(%ebp),%al
andl $0xf8,%eax
shrl $3,%eax
addl %eax,%edi
movb 12(%ebp),%al
andl $7,%eax
btsl %eax,(%edi)
popl %eax
end;
end;
{ testet, ob das Element b in der Menge p vorhanden ist }
{ und setzt das Carryflag entsprechend }
procedure do_in(p : pointer;b : byte);[public,alias: 'SET_IN_BYTE'];
begin
asm
pushl %eax
movl 8(%ebp),%edi
movb 12(%ebp),%al
andl $0xf8,%eax
shrl $3,%eax
addl %eax,%edi
movb 12(%ebp),%al
andl $7,%eax
btl %eax,(%edi)
popl %eax
end;
end;
{ vereinigt set1 und set2 und speichert das Ergebnis in dest }
procedure add_sets(set1,set2,dest : pointer);[public,alias: 'SET_ADD_SETS'];
begin
asm
movl 8(%ebp),%esi
movl 12(%ebp),%ebx
movl 16(%ebp),%edi
movl $8,%ecx
LMADDSETS1:
lodsl
orl (%ebx),%eax
stosl
addl $4,%ebx
decl %ecx
jnz LMADDSETS1
end;
end;
{ bildet den Durchschnitt von set1 und set2 }
{ und speichert das Ergebnis in dest }
procedure mul_sets(set1,set2,dest : pointer);[public,alias: 'SET_MUL_SETS'];
begin
asm
movl 8(%ebp),%esi
movl 12(%ebp),%ebx
movl 16(%ebp),%edi
movl $8,%ecx
LMMULSETS1:
lodsl
andl (%ebx),%eax
stosl
addl $4,%ebx
decl %ecx
jnz LMMULSETS1
end;
end;
{ bildet die Differenz von set1 und set2 }
{ und speichert das Ergebnis in dest }
procedure sub_sets(set1,set2,dest : pointer);[public,alias: 'SET_SUB_SETS'];
begin
asm
movl 8(%ebp),%esi
movl 12(%ebp),%ebx
movl 16(%ebp),%edi
movl $8,%ecx
LMSUBSETS1:
lodsl
movl (%ebx),%edx
notl %edx
andl %edx,%eax
stosl
addl $4,%ebx
decl %ecx
jnz LMSUBSETS1
end;
end;
{ vergleicht Mengen und setzt die Flags entsprechend }
procedure comp_sets(set1,set2 : pointer);[public,alias: 'SET_COMP_SETS'];
begin
asm
movl 8(%ebp),%esi
movl 12(%ebp),%edi
movl $8,%ecx
LMCOMPSETS1:
lodsl
movl (%edi),%edx
cmpl %edx,%eax
jne LMCOMPSETEND
addl $4,%edi
decl %ecx
jnz LMCOMPSETS1
// we are here only if the two sets are equal
// we have zero flag set, and that what is expected
cmpl %eax,%eax
LMCOMPSETEND:
end;
end;